'use strict';

// 云对象名：ai-service
module.exports = {
  /**
   * 获取AI响应
   * @param {string} message - 用户消息
   * @param {string} userId - 用户ID
   * @param {string} token - 用户token
   * @param {string} conversationId - 对话ID
   * @returns {object} AI响应
   */
  async getAIResponse(message, userId, token, conversationId) {
    try {
      const db = uniCloud.database();
      
      // 获取当前用户信息
      let currentUserId = '';
      
      if (userId) {
        currentUserId = userId;
      } else if (token) {
        try {
          const tokenResult = await db.collection('users').where({
            token: token
          }).get();
          
          if (tokenResult.data && tokenResult.data.length > 0) {
            currentUserId = tokenResult.data[0]._id;
          }
        } catch (error) {
          console.error('解析token出错:', error);
        }
      }
      
      if (!currentUserId) {
        return {
          code: -1,
          message: '用户未认证'
        };
      }
      
      if (!message) {
        return {
          code: -1,
          message: '消息内容不能为空'
        };
      }
      
      // 生成AI响应 - 直接内联实现避免方法调用问题
      const footballRules = [
        '越位规则：当球员处于越位位置且参与比赛时，裁判应判罚越位。',
        '手球犯规：除守门员在本方禁区内，其他球员故意用手触球属于犯规。',
        '红牌处罚：严重犯规、暴力行为、辱骂裁判等行为可被出示红牌。',
        '黄牌警告：非体育行为、持续犯规、延误比赛等行为会被出示黄牌。',
        '点球判罚：在禁区内发生的犯规通常会被判罚点球。'
      ];
      
      let response = '很抱歉，我暂时无法理解您的问题。请尝试询问足球规则相关的问题。';
      
      const lowerMessage = message.toLowerCase();
      
      if (lowerMessage.includes('越位') || lowerMessage.includes('offside')) {
        response = footballRules[0] + '\n\n越位的判定需要考虑球员位置、是否参与比赛、是否获得优势等因素。';
      } else if (lowerMessage.includes('手球') || lowerMessage.includes('handball')) {
        response = footballRules[1] + '\n\n手球的判定需要考虑是否故意、手臂位置是否自然等因素。';
      } else if (lowerMessage.includes('红牌') || lowerMessage.includes('red card')) {
        response = footballRules[2] + '\n\n红牌是最严厉的处罚，被罚下的球员不能继续参加比赛。';
      } else if (lowerMessage.includes('黄牌') || lowerMessage.includes('yellow card')) {
        response = footballRules[3] + '\n\n同一场比赛中累计两张黄牌等于一张红牌。';
      } else if (lowerMessage.includes('点球') || lowerMessage.includes('penalty')) {
        response = footballRules[4] + '\n\n点球是在禁区内犯规的直接后果，执行时其他球员需退出禁区。';
      } else if (lowerMessage.includes('规则') || lowerMessage.includes('rule')) {
        response = '足球比赛有17条基本规则，包括比赛场地、球、队员人数、装备、裁判员、助理裁判员、比赛时间、开始和重新开始比赛、球进出界、计胜方法、越位、犯规与不正当行为、任意球、点球、掷界外球、角球和球门球。您想了解哪一条规则的详细内容？';
      } else if (lowerMessage.includes('你好') || lowerMessage.includes('hello')) {
        response = '您好！我是足球裁判培训助手，可以为您解答足球规则、裁判执裁等相关问题。请问您想了解什么？';
      } else if (lowerMessage.includes('犯规') || lowerMessage.includes('foul')) {
        response = '足球比赛中的犯规包括：踢对方球员、绊倒对方、跳向对方、冲撞对方、打击对方、推拉对方、手球等。根据犯规严重程度，裁判可以给予警告（黄牌）、罚下（红牌）或判罚任意球/点球。';
      } else if (lowerMessage.includes('裁判') || lowerMessage.includes('referee')) {
        response = '裁判员是比赛的执法者，负责：1.执行比赛规则；2.控制比赛进程；3.记录比赛情况；4.确保球员安全；5.维护比赛秩序。裁判的判罚是最终决定，球员和教练应该尊重裁判的判罚。';
      }
      
      // 生成对话ID
      const newConversationId = conversationId || ('conv_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9));
      
      // 保存对话记录
      try {
        const dialogueData = {
          user_id: currentUserId,
          conversation_id: newConversationId,
          user_message: message,
          ai_response: response,
          create_time: new Date(),
          message_type: 'text'
        };
        
        await db.collection('ai_dialogues').add(dialogueData);
      } catch (error) {
        console.error('保存对话记录失败:', error);
        // 即使保存失败，也要返回AI响应
      }
      
      return {
        code: 0,
        message: '获取成功',
        data: {
          response: response,
          conversationId: newConversationId,
          timestamp: new Date()
        }
      };
    } catch (error) {
      console.error('获取AI响应失败:', error);
      return {
        code: -1,
        message: '获取AI响应失败: ' + error.message
      };
    }
  },

  /**
   * 保存对话记录
   * @param {string} userId - 用户ID
   * @param {string} userMessage - 用户消息
   * @param {string} aiResponse - AI响应
   * @param {string} conversationId - 对话ID
   * @returns {object} 保存结果
   */
  async saveDialogue(userId, userMessage, aiResponse, conversationId) {
    try {
      const db = uniCloud.database();
      
      if (!userId || !userMessage || !aiResponse) {
        return {
          code: -1,
          message: '参数不完整'
        };
      }
      
      const dialogueData = {
        user_id: userId,
        conversation_id: conversationId || this._generateConversationId(),
        user_message: userMessage,
        ai_response: aiResponse,
        create_time: new Date(),
        message_type: 'text'
      };
      
      const result = await db.collection('ai_dialogues').add(dialogueData);
      
      return {
        code: 0,
        message: '对话记录保存成功',
        data: {
          id: result.id
        }
      };
    } catch (error) {
      console.error('保存对话记录失败:', error);
      return {
        code: -1,
        message: '保存对话记录失败: ' + error.message
      };
    }
  },

  /**
   * 获取对话历史
   * @param {string} userId - 用户ID
   * @param {string} token - 用户token
   * @param {string} conversationId - 对话ID（可选）
   * @param {number} page - 页码
   * @param {number} limit - 每页数量
   * @returns {object} 对话历史
   */
  async getDialogueHistory(userId, token, conversationId, page = 1, limit = 20) {
    try {
      const db = uniCloud.database();
      
      // 获取当前用户信息
      let currentUserId = '';
      
      if (userId) {
        currentUserId = userId;
      } else if (token) {
        try {
          const tokenResult = await db.collection('users').where({
            token: token
          }).get();
          
          if (tokenResult.data && tokenResult.data.length > 0) {
            currentUserId = tokenResult.data[0]._id;
          }
        } catch (error) {
          console.error('解析token出错:', error);
        }
      }
      
      if (!currentUserId) {
        return {
          code: -1,
          message: '用户未认证'
        };
      }
      
      // 构建查询条件
      const where = { user_id: currentUserId };
      if (conversationId) {
        where.conversation_id = conversationId;
      }
      
      // 计算跳过数量
      const skip = (page - 1) * limit;
      
      // 查询对话历史
      const dialoguesResult = await db.collection('ai_dialogues')
        .where(where)
        .orderBy('create_time', 'desc')
        .skip(skip)
        .limit(limit)
        .get();
      
      // 查询总数
      const countResult = await db.collection('ai_dialogues')
        .where(where)
        .count();
      
      return {
        code: 0,
        message: '获取成功',
        data: dialoguesResult.data || [],
        total: countResult.total,
        page: page,
        limit: limit
      };
    } catch (error) {
      console.error('获取对话历史失败:', error);
      return {
        code: -1,
        message: '获取对话历史失败: ' + error.message
      };
    }
  },

  /**
   * 生成AI响应
   * @param {string} message - 用户消息
   * @param {string} userId - 用户ID
   * @param {string} conversationId - 对话ID
   * @returns {object} AI响应
   */
  _generateAIResponse(message, userId, conversationId) {
    // 足球裁判相关的知识库响应
    const footballRules = [
      '越位规则：当球员处于越位位置且参与比赛时，裁判应判罚越位。',
      '手球犯规：除守门员在本方禁区内，其他球员故意用手触球属于犯规。',
      '红牌处罚：严重犯规、暴力行为、辱骂裁判等行为可被出示红牌。',
      '黄牌警告：非体育行为、持续犯规、延误比赛等行为会被出示黄牌。',
      '点球判罚：在禁区内发生的犯规通常会被判罚点球。'
    ];
    
    // 简单的关键词匹配响应
    let response = '很抱歉，我暂时无法理解您的问题。请尝试询问足球规则相关的问题。';
    
    const lowerMessage = message.toLowerCase();
    
    if (lowerMessage.includes('越位') || lowerMessage.includes('offside')) {
      response = footballRules[0] + '\n\n越位的判定需要考虑球员位置、是否参与比赛、是否获得优势等因素。';
    } else if (lowerMessage.includes('手球') || lowerMessage.includes('handball')) {
      response = footballRules[1] + '\n\n手球的判定需要考虑是否故意、手臂位置是否自然等因素。';
    } else if (lowerMessage.includes('红牌') || lowerMessage.includes('red card')) {
      response = footballRules[2] + '\n\n红牌是最严厉的处罚，被罚下的球员不能继续参加比赛。';
    } else if (lowerMessage.includes('黄牌') || lowerMessage.includes('yellow card')) {
      response = footballRules[3] + '\n\n同一场比赛中累计两张黄牌等于一张红牌。';
    } else if (lowerMessage.includes('点球') || lowerMessage.includes('penalty')) {
      response = footballRules[4] + '\n\n点球是在禁区内犯规的直接后果，执行时其他球员需退出禁区。';
    } else if (lowerMessage.includes('规则') || lowerMessage.includes('rule')) {
      response = '足球比赛有17条基本规则，包括比赛场地、球、队员人数、装备、裁判员、助理裁判员、比赛时间、开始和重新开始比赛、球进出界、计胜方法、越位、犯规与不正当行为、任意球、点球、掷界外球、角球和球门球。您想了解哪一条规则的详细内容？';
    } else if (lowerMessage.includes('你好') || lowerMessage.includes('hello')) {
      response = '您好！我是足球裁判培训助手，可以为您解答足球规则、裁判执裁等相关问题。请问您想了解什么？';
    } else if (lowerMessage.includes('犯规') || lowerMessage.includes('foul')) {
      response = '足球比赛中的犯规包括：踢对方球员、绊倒对方、跳向对方、冲撞对方、打击对方、推拉对方、手球等。根据犯规严重程度，裁判可以给予警告（黄牌）、罚下（红牌）或判罚任意球/点球。';
    } else if (lowerMessage.includes('裁判') || lowerMessage.includes('referee')) {
      response = '裁判员是比赛的执法者，负责：1.执行比赛规则；2.控制比赛进程；3.记录比赛情况；4.确保球员安全；5.维护比赛秩序。裁判的判罚是最终决定，球员和教练应该尊重裁判的判罚。';
    }
    
    return {
      content: response,
      type: 'text',
      timestamp: new Date()
    };
  },

  /**
   * 生成对话ID
   * @returns {string} 对话ID
   */
  _generateConversationId() {
    return 'conv_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
  }
}; 